package com.wenx.v3auth.service;

import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

/**
 * 复合用户详情服务
 * 
 * 根据用户名前缀区分不同类型的用户：
 * - 以"platform:"开头的用户名使用平台用户认证服务
 * - 其他用户名使用系统用户认证服务
 * 
 * 这样可以在同一个认证系统中支持多种用户类型的认证
 * 
 * @author wenx
 */
@Slf4j
@RequiredArgsConstructor
public class CompositeUserDetailsService implements UserDetailsService {

    /**
     * 平台用户前缀
     */
    private static final String PLATFORM_USER_PREFIX = "platform:";

    @Qualifier("v3CustomUserDetailsService")
    private final UserDetailsService systemUserDetailsService;
    @Qualifier("platformUserDetailsService")
    private final UserDetailsService platformUserDetailsService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if (StrUtil.isBlank(username)) {
            throw new UsernameNotFoundException("用户名不能为空");
        }
        
        // 根据用户名前缀判断用户类型
        if (username.startsWith(PLATFORM_USER_PREFIX)) {
            // 平台用户认证
            String actualUsername = username.substring(PLATFORM_USER_PREFIX.length());
            log.debug("使用平台用户认证服务处理用户: {}", actualUsername);
            return platformUserDetailsService.loadUserByUsername(actualUsername);

        } else {
            // 系统用户认证
            log.debug("使用系统用户认证服务处理用户: {}", username);
            return systemUserDetailsService.loadUserByUsername(username);

        }
    }

}